package br.com.douglasramiro.controlefinanceiro.manager;

import java.io.Serializable;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Locale;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.servlet.http.HttpServletRequest;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;

import br.com.douglasramiro.controlefinanceiro.entity.Usuario;
import br.com.douglasramiro.controlefinanceiro.util.Constantes;
import br.com.douglasramiro.controlefinanceiro.util.Criptografia;
import br.com.douglasramiro.controlefinanceiro.util.Email;

@Name("usuarioMng")
@Scope(ScopeType.CONVERSATION)
@AutoCreate
public class UsuarioMng implements Serializable{
	private static final long serialVersionUID = 1L;
	
	@In private FacesMessages facesMessages;
	@In private EntityManager entityManager;
	@In private Usuario usuario;
	
	public String salvar(){
		if (usuario == null)
			throw new IllegalArgumentException("Argumento de usuário nulo.");
		
		if (!usuario.getSenha().equals(usuario.getConfSenha())){
			facesMessages.add("As senhas não conferem");
			FacesMessages.createFacesMessage(FacesMessage.SEVERITY_ERROR,"As senhas não conforem.");
			return null;
		}else{
			String senhaTemp = usuario.getSenha();
			usuario.setSenha(Criptografia.criptografar(usuario.getSenha()));
			usuario.setStatus(Constantes.USUARIO_NAO_CONFIRMADO);
			try{
				entityManager.merge(usuario);	
				String msgHtml = getMsgHtml(usuario, senhaTemp);
				Email email = new Email(usuario.getEmail(),"Cadastro Sistema Controle Financeiro",msgHtml);
				email.enviar();
				facesMessages.add("Sua conta foi criada com sucesso. Um email foi enviado para ativação da conta.");
				return "painel";
			}catch(Exception ex){
				ex.printStackTrace();
				Calendar cal = Calendar.getInstance(new Locale("pt","BR"));
				DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,new Locale("pt","BR"));
				facesMessages.add("Erro ao cadastrar usuário. \n\nHorário: "+df.format(cal.getTime())+"\n\nCausa: "+ex.toString());
				return null;				
			}
		}
	}

	public String ativarConta(){
		if (usuario == null)
			throw new IllegalArgumentException("Argumento de usuário nulo.");
		try{
			usuario = (Usuario)entityManager.createNamedQuery("usuario.ativarConta")
						.setParameter("user",usuario.getNome())
						.setParameter("senha",usuario.getSenha())
						.getSingleResult();
			
			usuario.setStatus(Constantes.USUARIO_ATIVO);
			entityManager.merge(usuario);
			facesMessages.add("Conta ativa com sucesso. Por favor, efetue o seu login.");
			return "efetuarLogin";
		}catch(NoResultException ex){
			facesMessages.add("Acesso não autorizado!");
			return null;	
		}catch (Exception ex) {
			ex.printStackTrace();
			Calendar cal = Calendar.getInstance(new Locale("pt","BR"));
			DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,new Locale("pt","BR"));
			facesMessages.add("Erro ao ativar usuário. \n\nHorário: "+df.format(cal.getTime())+"\n\nCausa: "+ex.toString());
			return null;	
			
		}			
	}
	private String getMsgHtml(Usuario usuario, String senha){
		FacesContext fctx = FacesContext.getCurrentInstance();
		HttpServletRequest request = (HttpServletRequest)fctx.getExternalContext().getRequest();
		String url = "http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();		
		String msg = "<html>" +
				"<body>" +
				"Obrigado por se cadastrar no sistema de controle financeiro. <br/>" +
				"Usu&atilde;rio: " +usuario.getUsuario() +
				"<br/>Senha: "+senha+
				"<br/> " +
				"Ative a sua conta clicando no link abaixo: <br/>"+
				"<a href=\""+url+"/site/ativar.seam?user="+usuario.getUsuario()+"&id="+usuario.getSenha()+"\">"+url+"/site/ativar?user="+usuario.getUsuario()+"&id="+usuario.getSenha()+"</a>"+
				"</body>" +
				"</html>";
		return msg;
	}
}

